package zhieasy.cn.model.common;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

@Data
@TableName("common_wechat_user")
@ApiModel
public class WechatUser implements Serializable, UserDetails {
    /**
     * openID
     */
    @TableId
    @ApiModelProperty("用户的OpenId")
    private String wxOpenId;

    /**
     * 微信UnionId
     */
    @ApiModelProperty("用户的wxUnionId")
    private String wxUnionId;

    /**
     * 微信昵称
     */
    @ApiModelProperty("微信昵称")
    private String wxNickName;

    /**
     * 国家/地区
     */
    @ApiModelProperty("国家/地区")
    private String wxCountry;

    /**
     * 省
     * 省
     */
    @ApiModelProperty("省")
    private String wxProvince;

    /**
     * 城市
     */
    @ApiModelProperty("城市")
    private String wxCity;

    /**
     * 微信绑定的手机号
     */
    @ApiModelProperty("微信绑定的手机号")
    private String wxPhone;

    /**
     * 平台的昵称（可与微信昵称作区分的）
     */
    @ApiModelProperty("平台的昵 称（可与微信昵称作区分的）")
    private String platformNickName;

    /**
     * 性别
     * {@link zhieasy.cn.common.enums.UserSexEnum}
     */
    @ApiModelProperty("性别  0：未知、1：男、2：女")
    private Integer wxSex;

    /**
     * 创建时间（毫秒级时间戳）
     */
    @ApiModelProperty("创建时间（毫秒级时间戳）")
    private Long createTime;

    /**
     * 更新时间（毫秒级时间戳）
     */
    @ApiModelProperty("更新时间（毫秒级时间戳）")
    private Long updateTime;

    /**
     * 微信头像URL
     */
    @ApiModelProperty("微信头像URL")
    private String wxHeadImg;

    /**
     * 个人中心背景图URL
     */
    @ApiModelProperty("个人中心背景图URL")
    private String backgroundImg;

    /**
     * 权限列表
     */
    @TableField(exist = false)
    @JsonIgnore
    private List<Permission> permissionList;

    /**
     * 这个人的角色
     */
    @TableField(exist = false)
    private List<Role> roleList;

    /**
     * 由于authorities不是数据库里面的字段，所以要排除他，不然mybatis-plus找不到该字段会报错
     */
    @TableField(exist = false)
    @JsonIgnore
    Collection<? extends GrantedAuthority> authorities;


    /**
     * 当前的sessionId
     */
    @JsonIgnore
    @TableField(exist = false)
    String sessionKey;

    /**
     * 获取密码,不用这个
     * @return
     */
    @Override
    @JsonIgnore
    public String getPassword() {
        return null;
    }

    /**
     * 获取union
     * @return
     */
    @Override
    @JsonIgnore
    public String getUsername() {
        return this.wxOpenId;
    }

    /**
     * 帐户是否过期(1 未过期，0已过期)
     * @return
     */
    @Override
    @JsonIgnore
    public boolean isAccountNonExpired() {
        return true;
    }

    /**
     *帐户是否被锁定(1 未锁定，0已锁定)
     * @return
     */
    @Override
    @JsonIgnore
    public boolean isAccountNonLocked() {
        return true;
    }

    /**
     *密码是否过期(1 未过期，0已过期)
     * @return
     */
    @Override
    @JsonIgnore
    public boolean isCredentialsNonExpired() {
        return true;
    }

    /**
     *帐户是否可用(1 可用，0 删除用户)
     * @return
     */
    @Override
    @JsonIgnore
    public boolean isEnabled() {
        return true;
    }

    /**
     * 从security中获取wechatuser
     * @return
     */
    public static WechatUser getWechatUserFromSecurityContext(){
        SecurityContext ctx = SecurityContextHolder.getContext();
        Authentication auth = ctx.getAuthentication();
         return (WechatUser) auth.getPrincipal();
    }

    public static String getWechatUserOpenIdFromSecurityContext(){
        SecurityContext ctx = SecurityContextHolder.getContext();
        Authentication auth = ctx.getAuthentication();
        return ((WechatUser) auth.getPrincipal()).getUsername();
    }
}
